/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package edu.ccut.saturn.component;

import java.util.List;

import edu.ccut.saturn.component.loader.NodeResolver;

/**
 * 定义结点类型的接口，每种类型的结点类都必须实现这个接口定义的方法。
 * <p>
 * 在Saturn平台中结点位于action组件及logic组件内部,是组成流程逻辑的基本元素,每个结点都是可运行的，拥有自己的执行逻辑。 其中<method>execute</method>方法是实现了结点的运行逻辑。由于组件是单态存在的，所以结点的<method>execute</method>方法内部必须是线程安全的。
 * <p>
 * 通过<code>NodeResolver</code>从配置文件中加载并构建结点实例。结点实例保存到<code>ILogicComponentInfo</code>、<code>IActionComponentInfo</code>之中。
 * <p>
 * Node Type include:
 * <li>1. Start Node
 * <li>2. End Node
 * <li>3. Component Node
 * <li>4. Logic Node
 * <li>5. view Node
 * <li>6. Decision Node
 * <li>7. Start Transaction Node
 * <li>8. End Transaction Node
 * <li>9. Rollback Transaction Node
 * <li>10. Start Iterator Node
 * <li>11. End Iterator Node
 * <li>12. start transaction Node
 * <li>13. commit transaction Node
 * <li>14. switch Node
 * <li>15. Data Node
 * <li>16. Data Mapping Node
 * <li>17. Workflow Node
 * <li>18. SubAction Node
 * <li>19. Transform Node
 * <li>20. WebContext Node
 * 
 * @author LeslieGu
 * 
 * @version 1.0 2008.8.18
 * 
 * @see ILogicComponentInfo
 * @see IActionComponentInfo
 * @see NodeResolver
 */
// TODO：执行方法是否应该写到这里
public interface INodeInfo extends XmlSerializable {

	/**
	 * 获得结点的唯一标识。
	 * 
	 * @return 返回一个当前结点id的字符串值
	 */
	public String getId();

	/**
	 * 获得当前节点的x坐标
	 * 
	 * @return 返回当前节点的x坐标
	 */
	public String getX();

	/**
	 * 获得当前节点的y坐标
	 * 
	 * @return 返回当前节点的y坐标
	 */
	public String getY();

	/**
	 * 获得节点类型
	 * 
	 * @return
	 */
	public String getNodeType();

	/**
	 * 获得结点中定义的组件唯一标示，若没有组件返回null
	 * 
	 * @return
	 */
	public String getKey();

	/**
	 * 获得结点的名称。
	 * 
	 * @return 返回结点名称的字符串值
	 */
	public String getName();

	/**
	 * 获得结点的描述信息
	 * 
	 * @return 返回结点的描述信息
	 */
	public String getDescription();

	/**
	 * 获得结点的参数列表。
	 * 
	 * @return 返回结点的参数列表
	 */
	public List<IParameterInfo> getParameterInfos();

	/**
	 * 获得当前结点的下一运行结点的id
	 * 
	 * @return 返回下一结点id的字符串的值
	 */
	public String getNextId();

	/**
	 * 定义结点的执行逻辑。不同的结点需要提供相应的执行逻辑。 这个方法应该确保是线程安全的，运行时的一些有状态信息应该保存到参数<code>logicContext</code>中。
	 * 
	 * @param logicContext
	 *            保存结点的当前执行环境的上下文信息，用于结点的执行逻辑之中。
	 * 
	 * @throws Exception
	 */
	public void execute(ILogicContext logicContext) throws Exception;
}
